﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Timers;
using HueLampStatusDetector.Status;
using Microsoft.Lync.Model;

namespace HueLampStatusDetector.StatusChecker
{
    public class LyncStatusChecker : IStatusChecker
    {
        private StatusType _oldStatusType = StatusType.Free;
        private object _padLock = new object();

        public LyncStatusChecker()
        {
            Timer timer = new Timer();
            timer.Interval = TimeSpan.FromSeconds(1).TotalMilliseconds;
            timer.Elapsed += OnTimeElapsed;
            timer.Start();
        }

        public ChangeStatus ChangeStatus { get; set; }

        private void OnTimeElapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                LyncClient client = LyncClient.GetClient();

                List<object> states = (List<object>)client.Self.
                    Contact.GetContactInformation(ContactInformationType.CustomActivity);

                var status = GetStatus(states);

                lock (_padLock)
                {
                    if (status == _oldStatusType)
                    {
                        return;
                    }

                    Trace.TraceInformation("Lync statusType: {0}", status);
                    SendNotification(status);
                    _oldStatusType = status;
                }
            }
            catch (Exception err)
            {
                Trace.TraceError(err.ToString());
            }
        }

        private StatusType GetStatus(List<object> states)
        {
            StatusType statusType = StatusType.Free;
            if (states.Count == 0)
            {
                throw new Exception("States of Lync is 0");
            }
            if (states.FirstOrDefault(x => ((LocaleString) x).Value == "Available") == null)
            {
                statusType = StatusType.Busy;
            }
            return statusType;
        }

        private void SendNotification(StatusType statusType)
        {
            if (ChangeStatus != null)
            {
                ChangeStatus.Invoke(this, new ChangeStatusEventArgs(statusType));
            }
        }
    }
}